﻿using System.Collections;

namespace Narau.Common
{
    class ShikenGenerator
    {
        public enum EShikenStatus
        {
            HAJIMARI,
            NEW_MONDAI,
            CHECK_MONDAI,
            OWARI,
            ERROR
        }

        private EShikenStatus m_Status = EShikenStatus.HAJIMARI;

        private ArrayList  m_MondaiList;
        private int        m_IdxMondai;
        private Mondai     m_CurrentMondai;
        private int        m_iNumOK;
        private int        m_iNumFail;
        private bool       m_bLastOK;

        public int    NumMondai  { get { return m_MondaiList.Count; } }
        public int    IdxMondai  { get { return m_IdxMondai; } }
        public Mondai ActMondai  { get { return m_CurrentMondai;   } }
        public int    NumOK      { get { return m_iNumOK;   } }
        public int    NumFail    { get { return m_iNumFail; } }
        public bool   LastOK     { get { return m_bLastOK;  } }

        //--------------
        // Constructor
        //--------------
        public ShikenGenerator()
        {
            m_MondaiList = new ArrayList();

            m_bLastOK = false;
            m_iNumOK = 0;
            m_iNumFail = 0;
            m_IdxMondai = 0;
            m_MondaiList.Clear();
        }

        //[H][B]
        /*public void Begin()
        {
            
        }*/

        public void AddMondai(Mondai in_mondai)
        {
            // Hay que comprobar que un ejercicio concreto solo se añada una vez
            if (m_MondaiList.Contains(in_mondai) == false)
            {
                m_MondaiList.Add(in_mondai);
            }
        }

        //--------------------------------------
        // Avance en la realización del examen
        //--------------------------------------
        public EShikenStatus Step(int iTick)
        {
            if (m_Status != EShikenStatus.OWARI)
            {
                if (m_Status == EShikenStatus.HAJIMARI || m_Status == EShikenStatus.CHECK_MONDAI)
                {
                    if (m_IdxMondai < m_MondaiList.Count)
                    {
                        m_CurrentMondai = m_MondaiList[m_IdxMondai] as Mondai;
                        m_IdxMondai++;
                        m_Status = EShikenStatus.NEW_MONDAI;
                    }
                    else
                    {
                        // Examen terminado
                        // Guardado de los resultados de los ejercicios
                        foreach (Mondai itMondai in m_MondaiList)
                        {
                            itMondai.Result.UpdateXML();
                        }

                        m_Status = EShikenStatus.OWARI;
                    }
                }
                else
                {
                    if (m_Status == EShikenStatus.NEW_MONDAI)
                    {
                        if (m_CurrentMondai != null)
                        {
                            m_CurrentMondai.Check(iTick);
                            if (m_CurrentMondai.IsOK())
                            {
                                m_iNumOK++;
                            }
                            else
                            {
                                m_iNumFail++;
                            }
                            m_Status = EShikenStatus.CHECK_MONDAI;
                        }
                        else
                        {
                            m_Status = EShikenStatus.ERROR;
                        }
                    }
                }
            }

            return m_Status;
        }

        //[H][B]
        /*public Mondai GetNextMondai(int iTick)
        {
            Mondai retMondai = null;

            // Si se presentó un ejercicio antes, corregirlo
            if (m_iCurrentMondai > 0)
            {
                m_bLastOK = (m_MondaiList[m_iCurrentMondai - 1] as Mondai).Check(iTick);
                if (m_bLastOK)
                {
                    m_iNumOK++;
                }
                else
                {
                    m_iNumFail++;
                }
            }

            if (m_iCurrentMondai < m_MondaiList.Count)
            {
                retMondai = m_MondaiList[m_iCurrentMondai] as Mondai;
                m_iCurrentMondai++;
            }

            // Detección de finalización del examen. Guardado de resultados en xml
            if (retMondai == null)
            {
                foreach(Mondai itMondai in m_MondaiList)
                {
                    itMondai.Result.UpdateXML();
                }
            }

            return retMondai;
        }*/
    }
}
